package collection.test;

import java.util.ArrayList;
import java.util.Collection;

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public boolean equals(Object obj) {  //Cat|Student
//        如果当前对象与传入的对象是同一个对象，直接返回true
        if (this == obj) return true;
//        如果传入对象是null或者与当前类对象类不同，直接返回false
//        Person != Student
        if (obj == null || getClass() != obj.getClass()) return false;
//        将传入对象转换为当前类对象
        Person person = (Person) obj;
//        以下equals()是调用String类的equals()方法比较
//        == 与 equals()的区别：
//        == 引用类型：比较的是内存地址  基本类型：比较的是值
//        equals() 在String类的方法，比较的是值 ，在Object类中的equals()方法比较的是内存地址

//
        return age == person.age && name.equals(person.name);
    }


    public static void main(String[] args) {
        int[] arr = new int[9];
//        以下赋值是基本类型
        arr[0] = 1;
        Person[] arr2 = new Person[9];
        //        以下赋值是引用类型
        arr2[0] = new Person("张三", 20);

        Collection<Person> c = new ArrayList();
        Person p1 = new Person("张三", 20);
        Person p2 = new Person("张三", 20);
        System.out.println(p1.hashCode());
        System.out.println(p2.hashCode());
        System.out.println(p1.equals(p2));
//      以下错误原因因为集合放的泛型是Person类型，不能放String类型
//        c.add("aaa");
        c.add(p1);
//   输出false，因为调用的是Object类的默认equals()方法，比较的是内存地址
        System.out.println(c.contains(p2));


//        需求：想要集合对对象c调用contains()想要比较的是对象的name和age属性，而不是内存地址

    }
}
